Micron Document
🎖️GitЯра🎖️

Node / meshcore / MeshCore / files / test / test_kiss_modem / test_tx_backpressure.cpp

Displaying Raw • Download

test/test_kiss_modem/test_tx_backpressure.cpp 9f73fbf87002682ba3c1f3da32b7252d8ea2feda (9f73fbf8) Text, 9.25 KB

Tff7b72#Tff7b72include T8b949e<gtest/gtest.h>

Tff7b72#Tff7b72include T8b949e<atomic>
Tff7b72#Tff7b72include T8b949e<cstddef>
Tff7b72#Tff7b72include T8b949e<condition_variable>
Tff7b72#Tff7b72include T8b949e<future>
Tff7b72#Tff7b72include T8b949e<mutex>
Tff7b72#Tff7b72include T8b949e<queue>
Tff7b72#Tff7b72include T8b949e<vector>

Tff7b72#Tff7b72include T8b949e"KissModem.h"

Tff7b72static Tff7b72constexpr Tffa657int Te6edf3TEST_TX_AVAILABLE_BYTES Tff7b72= T79c0ff4096Tb4b4b4;
Tff7b72static Tff7b72constexpr Tffa657size_t Te6edf3TEST_DEFAULT_MAX_WRITE_CHUNK Tff7b72= Te6edf3SIZE_MAXTb4b4b4;
Tff7b72static Tff7b72constexpr Tffa657size_t Te6edf3TEST_PARTIAL_WRITE_CHUNK Tff7b72= T79c0ff2Tb4b4b4;
Tff7b72static Tff7b72constexpr Tffa657int Te6edf3TEST_PARTIAL_WRITE_FLUSH_LOOPS Tff7b72= T79c0ff3Tb4b4b4;
Tff7b72static Tff7b72constexpr Tffa657uint8_t Te6edf3TEST_SNR Tff7b72= T79c0ff8Tb4b4b4;
Tff7b72static Tff7b72constexpr Tffa657uint8_t Te6edf3TEST_RSSI Tff7b72= T79c0ff200Tb4b4b4;

Tff7b72class T56d364BlockingStream Tff7b72: Tff7b72public Te6edf3Stream Tb4b4b4{
Tff7b72publicTff7b72:
Tffa657void Te6edf3pushRxTb4b4b4(Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72>Tff7b72& Te6edf3bytesTb4b4b4) Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3lock_guardTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3mutexTff7b72> Te6edf3lockTb4b4b4(Te6edf3_mutexTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657uint8_t Te6edf3b Tff7b72: Te6edf3bytesTb4b4b4) Tb4b4b4{
Te6edf3_rxTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3bTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tffa657void Te6edf3setBlockWritesTb4b4b4(Tffa657bool Te6edf3blockedTb4b4b4) Tb4b4b4{
Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3lock_guardTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3mutexTff7b72> Te6edf3lockTb4b4b4(Te6edf3_mutexTb4b4b4)Tb4b4b4;
Te6edf3_block_writes Tff7b72= Te6edf3blockedTb4b4b4;
Tb4b4b4}
Te6edf3_cvTb4b4b4.Te6edf3notify_allTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657bool Te6edf3isWriteBlockedTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return Te6edf3_entered_blockTb4b4b4.Te6edf3loadTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657size_t Te6edf3writesCountTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3lock_guardTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3mutexTff7b72> Te6edf3lockTb4b4b4(Te6edf3_mutexTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3_writesTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72> Te6edf3writesSnapshotTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3lock_guardTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3mutexTff7b72> Te6edf3lockTb4b4b4(Te6edf3_mutexTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3_writesTb4b4b4;
Tb4b4b4}

Tffa657int Te6edf3availableForWriteTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3lock_guardTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3mutexTff7b72> Te6edf3lockTb4b4b4(Te6edf3_mutexTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3_block_writes Tff7b72? T79c0ff0 Tff7b72: Te6edf3TEST_TX_AVAILABLE_BYTESTb4b4b4;
Tb4b4b4}

Tffa657void Te6edf3setMaxWriteChunkTb4b4b4(Tffa657size_t Te6edf3chunkTb4b4b4) Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3lock_guardTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3mutexTff7b72> Te6edf3lockTb4b4b4(Te6edf3_mutexTb4b4b4)Tb4b4b4;
Te6edf3_max_write_chunk Tff7b72= Te6edf3chunkTb4b4b4;
Tb4b4b4}

Tffa657size_t Te6edf3writeTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3bufferTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4) Tff7b72override Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3unique_lockTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3mutexTff7b72> Te6edf3lockTb4b4b4(Te6edf3_mutexTb4b4b4)Tb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3_block_writesTb4b4b4) Tb4b4b4{
Te6edf3_entered_blockTb4b4b4.Te6edf3storeTb4b4b4(Tffa657trueTb4b4b4)Tb4b4b4;
Te6edf3_cvTb4b4b4.Te6edf3waitTb4b4b4(Te6edf3lockTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72const Tffa657size_t Te6edf3chunk Tff7b72= Tb4b4b4(Te6edf3size Tff7b72< Te6edf3_max_write_chunkTb4b4b4) Tff7b72? Te6edf3size Tff7b72: Te6edf3_max_write_chunkTb4b4b4;
Tff7b72for Tb4b4b4(Tffa657size_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3chunkTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3_writesTb4b4b4.Te6edf3push_backTb4b4b4(Te6edf3bufferTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3chunkTb4b4b4;
Tb4b4b4}

Tffa657size_t Te6edf3writeTb4b4b4(Tffa657uint8_t Te6edf3bTb4b4b4) Tff7b72override Tb4b4b4{
Tff7b72return Te6edf3writeTb4b4b4(Tff7b72&Te6edf3bTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657int Te6edf3availableTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3lock_guardTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3mutexTff7b72> Te6edf3lockTb4b4b4(Te6edf3_mutexTb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72static_castTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3_rxTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657int Te6edf3readTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3lock_guardTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3mutexTff7b72> Te6edf3lockTb4b4b4(Te6edf3_mutexTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_rxTb4b4b4.Te6edf3emptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return T79c0ff-1Tb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3b Tff7b72= Te6edf3_rxTb4b4b4.Te6edf3frontTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3_rxTb4b4b4.Te6edf3popTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3bTb4b4b4;
Tb4b4b4}

Tff7b72privateTff7b72:
Tff7b72mutable Te6edf3stdTff7b72:Tff7b72:Te6edf3mutex Te6edf3_mutexTb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3condition_variable Te6edf3_cvTb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3queueTff7b72<Tffa657uint8_tTff7b72> Te6edf3_rxTb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72> Te6edf3_writesTb4b4b4;
Tffa657bool Te6edf3_block_writes Tff7b72= Tffa657falseTb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3atomicTff7b72<Tffa657boolTff7b72> Te6edf3_entered_block Tff7b72= Tffa657falseTb4b4b4;
Tffa657size_t Te6edf3_max_write_chunk Tff7b72= Te6edf3TEST_DEFAULT_MAX_WRITE_CHUNKTb4b4b4;
Tb4b4b4}Tb4b4b4;

Tff7b72class T56d364FakeRNG Tff7b72: Tff7b72public Te6edf3meshTff7b72:Tff7b72:Te6edf3RNG Tb4b4b4{
Tff7b72publicTff7b72:
Tffa657void Te6edf3randomTb4b4b4(Tffa657uint8_tTff7b72* Te6edf3destTb4b4b4, Tffa657size_t Te6edf3szTb4b4b4) Tff7b72override Tb4b4b4{
Tff7b72for Tb4b4b4(Tffa657size_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3szTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3destTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4;

Tff7b72class T56d364FakeRadio Tff7b72: Tff7b72public Te6edf3meshTff7b72:Tff7b72:Te6edf3Radio Tb4b4b4{
Tff7b72publicTff7b72:
Tffa657bool Te6edf3isReceivingTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tff7b72return Tffa657falseTb4b4b4; Tb4b4b4}
Tffa657uint32_t Te6edf3getEstAirtimeForTb4b4b4(Tffa657uint16_tTb4b4b4) Tff7b72override Tb4b4b4{ Tff7b72return T79c0ff10Tb4b4b4; Tb4b4b4}
Tffa657bool Te6edf3startSendRawTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72*Tb4b4b4, Tffa657uint16_tTb4b4b4) Tff7b72override Tb4b4b4{
Te6edf3_start_send_countTff7b72+Tff7b72+Tb4b4b4;
Tff7b72return Te6edf3_start_send_resultTb4b4b4;
Tb4b4b4}
Tffa657bool Te6edf3isSendCompleteTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tff7b72return Te6edf3_send_completeTb4b4b4; Tb4b4b4}
Tffa657void Te6edf3onSendFinishedTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Te6edf3_send_finished_countTff7b72+Tff7b72+Tb4b4b4; Tb4b4b4}
Tffa657int16_t Te6edf3getNoiseFloorTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tff7b72return T79c0ff-120Tb4b4b4; Tb4b4b4}

Tffa657void Te6edf3setStartSendResultTb4b4b4(Tffa657bool Te6edf3resultTb4b4b4) Tb4b4b4{ Te6edf3_start_send_result Tff7b72= Te6edf3resultTb4b4b4; Tb4b4b4}
Tffa657void Te6edf3setSendCompleteTb4b4b4(Tffa657bool Te6edf3completeTb4b4b4) Tb4b4b4{ Te6edf3_send_complete Tff7b72= Te6edf3completeTb4b4b4; Tb4b4b4}
Tffa657int Te6edf3startSendCountTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Te6edf3_start_send_countTb4b4b4; Tb4b4b4}
Tffa657int Te6edf3sendFinishedCountTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Te6edf3_send_finished_countTb4b4b4; Tb4b4b4}

Tff7b72privateTff7b72:
Tffa657bool Te6edf3_start_send_result Tff7b72= Tffa657trueTb4b4b4;
Tffa657bool Te6edf3_send_complete Tff7b72= Tffa657trueTb4b4b4;
Tffa657int Te6edf3_start_send_count Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3_send_finished_count Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}Tb4b4b4;

Tff7b72class T56d364FakeBoard Tff7b72: Tff7b72public Te6edf3meshTff7b72:Tff7b72:Te6edf3MainBoard Tb4b4b4{
Tff7b72publicTff7b72:
Tffa657uint16_t Te6edf3getBattMilliVoltsTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tff7b72return T79c0ff4200Tb4b4b4; Tb4b4b4}
Tffa657float Te6edf3getMCUTemperatureTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tff7b72return T79c0ff24.0fTb4b4b4; Tb4b4b4}
Tff7b72const Tffa657charTff7b72* Te6edf3getManufacturerNameTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tff7b72return Ta5d6ff"Ta5d6fftest-boardTa5d6ff"Tb4b4b4; Tb4b4b4}
Tffa657void Te6edf3rebootTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{Tb4b4b4}
Tb4b4b4}Tb4b4b4;

Tff7b72class T56d364FakeSensors Tff7b72: Tff7b72public Te6edf3SensorManager Tb4b4b4{
Tff7b72publicTff7b72:
Tffa657bool Te6edf3querySensorsTb4b4b4(Tffa657uint8_tTb4b4b4, Te6edf3CayenneLPPTff7b72&Tb4b4b4) Tff7b72override Tb4b4b4{ Tff7b72return Tffa657falseTb4b4b4; Tb4b4b4}
Tb4b4b4}Tb4b4b4;

Tff7b72class T56d364KissModemFixture Tff7b72: Tff7b72public Tff7b72:Tff7b72:Te6edf3testingTff7b72:Tff7b72:Te6edf3Test Tb4b4b4{
Tff7b72protectedTff7b72:
Te6edf3BlockingStream Te6edf3serialTb4b4b4;
Te6edf3meshTff7b72:Tff7b72:Te6edf3LocalIdentity Te6edf3identityTb4b4b4;
Te6edf3FakeRNG Te6edf3rngTb4b4b4;
Te6edf3FakeRadio Te6edf3radioTb4b4b4;
Te6edf3FakeBoard Te6edf3boardTb4b4b4;
Te6edf3FakeSensors Te6edf3sensorsTb4b4b4;
Te6edf3KissModem Te6edf3modemTb4b4b4;

Te6edf3KissModemFixtureTb4b4b4(Tb4b4b4)
Tff7b72: Te6edf3modemTb4b4b4(Te6edf3serialTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3rngTb4b4b4, Te6edf3radioTb4b4b4, Te6edf3boardTb4b4b4, Te6edf3sensorsTb4b4b4) Tb4b4b4{
Te6edf3modemTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72> Te6edf3dataFrameTb4b4b4(Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72>Tff7b72& Te6edf3packetTb4b4b4) Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72> Te6edf3frame Tff7b72= Tb4b4b4{Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_DATATb4b4b4}Tb4b4b4;
Te6edf3frameTb4b4b4.Te6edf3insertTb4b4b4(Te6edf3frameTb4b4b4.Te6edf3endTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3packetTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3packetTb4b4b4.Te6edf3endTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3frameTb4b4b4.Te6edf3push_backTb4b4b4(Te6edf3KISS_FENDTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3frameTb4b4b4;
Tb4b4b4}

Tffa657void Te6edf3advanceToTxSendingTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3modemTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3modemTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3KISS_DEFAULT_TXDELAY Tff7b72* T79c0ff10Tb4b4b4)Tb4b4b4;
Te6edf3modemTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;

Te6edf3TEST_FTb4b4b4(Te6edf3KissModemFixtureTb4b4b4, Te6edf3PingResponseShouldNotStallLoopUnderTxBackpressureTb4b4b4) Tb4b4b4{
Te6edf3serialTb4b4b4.Te6edf3setBlockWritesTb4b4b4(Tffa657trueTb4b4b4)Tb4b4b4;
Te6edf3serialTb4b4b4.Te6edf3pushRxTb4b4b4(Tb4b4b4{Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_SETHARDWARETb4b4b4, Te6edf3HW_CMD_PINGTb4b4b4, Te6edf3KISS_FENDTb4b4b4}Tb4b4b4)Tb4b4b4;

Tff7b72auto Te6edf3future Tff7b72= Te6edf3stdTff7b72:Tff7b72:Te6edf3asyncTb4b4b4(Te6edf3stdTff7b72:Tff7b72:Te6edf3launchTff7b72:Tff7b72:Te6edf3asyncTb4b4b4, Tb4b4b4[Tff7b72thisTb4b4b4]Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3modemTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Tff7b72auto Te6edf3status Tff7b72= Te6edf3futureTb4b4b4.Te6edf3wait_forTb4b4b4(Te6edf3stdTff7b72:Tff7b72:Te6edf3chronoTff7b72:Tff7b72:Te6edf3millisecondsTb4b4b4(T79c0ff100Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3EXPECT_EQTb4b4b4(Te6edf3statusTb4b4b4, Te6edf3stdTff7b72:Tff7b72:Te6edf3future_statusTff7b72:Tff7b72:Te6edf3readyTb4b4b4) Tff7b72<Tff7b72< Ta5d6ff"Ta5d6ffKissModem::loop blocked in serial write under TX backpressureTa5d6ff"Tb4b4b4;
Te6edf3EXPECT_FALSETb4b4b4(Te6edf3serialTb4b4b4.Te6edf3isWriteBlockedTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72<Tff7b72< Ta5d6ff"Ta5d6ffKissModem entered blocking write pathTa5d6ff"Tb4b4b4;

Te6edf3serialTb4b4b4.Te6edf3setBlockWritesTb4b4b4(Tffa657falseTb4b4b4)Tb4b4b4;
Te6edf3futureTb4b4b4.Te6edf3waitTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3modemTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3EXPECT_GTTb4b4b4(Te6edf3serialTb4b4b4.Te6edf3writesCountTb4b4b4(Tb4b4b4)Tb4b4b4, T79c0ff0UTb4b4b4) Tff7b72<Tff7b72< Ta5d6ff"Ta5d6ffKissModem did not flush queued response after backpressure clearedTa5d6ff"Tb4b4b4;
Tb4b4b4}

Te6edf3TEST_FTb4b4b4(Te6edf3KissModemFixtureTb4b4b4, Te6edf3PingResponseKeepsStandardKissFramingTb4b4b4) Tb4b4b4{
Te6edf3serialTb4b4b4.Te6edf3pushRxTb4b4b4(Tb4b4b4{Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_SETHARDWARETb4b4b4, Te6edf3HW_CMD_PINGTb4b4b4, Te6edf3KISS_FENDTb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3modemTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72> Te6edf3expected Tff7b72= Tb4b4b4{Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_SETHARDWARETb4b4b4, Te6edf3HW_RESPTb4b4b4(Te6edf3HW_CMD_PINGTb4b4b4)Tb4b4b4, Te6edf3KISS_FENDTb4b4b4}Tb4b4b4;
Te6edf3EXPECT_EQTb4b4b4(Te6edf3serialTb4b4b4.Te6edf3writesSnapshotTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3expectedTb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3TEST_FTb4b4b4(Te6edf3KissModemFixtureTb4b4b4, Te6edf3PingResponseKeepsFramingWithPartialBulkWritesTb4b4b4) Tb4b4b4{
Te6edf3serialTb4b4b4.Te6edf3setMaxWriteChunkTb4b4b4(Te6edf3TEST_PARTIAL_WRITE_CHUNKTb4b4b4)Tb4b4b4;
Te6edf3serialTb4b4b4.Te6edf3pushRxTb4b4b4(Tb4b4b4{Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_SETHARDWARETb4b4b4, Te6edf3HW_CMD_PINGTb4b4b4, Te6edf3KISS_FENDTb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3TEST_PARTIAL_WRITE_FLUSH_LOOPSTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3modemTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72> Te6edf3expected Tff7b72= Tb4b4b4{Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_SETHARDWARETb4b4b4, Te6edf3HW_RESPTb4b4b4(Te6edf3HW_CMD_PINGTb4b4b4)Tb4b4b4, Te6edf3KISS_FENDTb4b4b4}Tb4b4b4;
Te6edf3EXPECT_EQTb4b4b4(Te6edf3serialTb4b4b4.Te6edf3writesSnapshotTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3expectedTb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3TEST_FTb4b4b4(Te6edf3KissModemFixtureTb4b4b4, Te6edf3PacketAndMetaAreQueuedTogetherUnderBackpressureTb4b4b4) Tb4b4b4{
Tff7b72static Tff7b72constexpr Tffa657uint8_t Te6edf3TEST_PACKETTb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0x01Tb4b4b4, T79c0ff0x02Tb4b4b4, T79c0ff0x03Tb4b4b4}Tb4b4b4;

Te6edf3serialTb4b4b4.Te6edf3setBlockWritesTb4b4b4(Tffa657trueTb4b4b4)Tb4b4b4;
Te6edf3modemTb4b4b4.Te6edf3onPacketReceivedTb4b4b4(Tb4b4b4(Tffa657int8_tTb4b4b4)Te6edf3TEST_SNRTb4b4b4, Tb4b4b4(Tffa657int8_tTb4b4b4)Te6edf3TEST_RSSITb4b4b4, Te6edf3TEST_PACKETTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3TEST_PACKETTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3serialTb4b4b4.Te6edf3setBlockWritesTb4b4b4(Tffa657falseTb4b4b4)Tb4b4b4;
Te6edf3modemTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3modemTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72> Te6edf3expected Tff7b72= Tb4b4b4{
Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_DATATb4b4b4, Te6edf3TEST_PACKETTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3TEST_PACKETTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3TEST_PACKETTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3KISS_FENDTb4b4b4,
Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_SETHARDWARETb4b4b4, Te6edf3HW_RESP_RX_METATb4b4b4, Te6edf3TEST_SNRTb4b4b4, Te6edf3TEST_RSSITb4b4b4, Te6edf3KISS_FENDTb4b4b4}Tb4b4b4;
Te6edf3EXPECT_EQTb4b4b4(Te6edf3serialTb4b4b4.Te6edf3writesSnapshotTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3expectedTb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3TEST_FTb4b4b4(Te6edf3KissModemFixtureTb4b4b4, Te6edf3RadioTxCompletionAdvancesWhileHostOutputIsBackedUpTb4b4b4) Tb4b4b4{
Te6edf3serialTb4b4b4.Te6edf3pushRxTb4b4b4(Te6edf3dataFrameTb4b4b4(Tb4b4b4{T79c0ff0x42Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3advanceToTxSendingTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ASSERT_EQTb4b4b4(Te6edf3radioTb4b4b4.Te6edf3startSendCountTb4b4b4(Tb4b4b4)Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;

Te6edf3serialTb4b4b4.Te6edf3setBlockWritesTb4b4b4(Tffa657trueTb4b4b4)Tb4b4b4;
Te6edf3modemTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3EXPECT_EQTb4b4b4(Te6edf3radioTb4b4b4.Te6edf3sendFinishedCountTb4b4b4(Tb4b4b4)Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3EXPECT_TRUETb4b4b4(Te6edf3modemTb4b4b4.Te6edf3isTxBusyTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;

Te6edf3serialTb4b4b4.Te6edf3setBlockWritesTb4b4b4(Tffa657falseTb4b4b4)Tb4b4b4;
Te6edf3modemTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72> Te6edf3expected Tff7b72= Tb4b4b4{Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_SETHARDWARETb4b4b4, Te6edf3HW_RESP_TX_DONETb4b4b4, T79c0ff0x01Tb4b4b4, Te6edf3KISS_FENDTb4b4b4}Tb4b4b4;
Te6edf3EXPECT_EQTb4b4b4(Te6edf3serialTb4b4b4.Te6edf3writesSnapshotTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3expectedTb4b4b4)Tb4b4b4;
Te6edf3EXPECT_FALSETb4b4b4(Te6edf3modemTb4b4b4.Te6edf3isTxBusyTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3TEST_FTb4b4b4(Te6edf3KissModemFixtureTb4b4b4, Te6edf3QueueFullReportsBusyWithoutDroppingQueuedFramesTb4b4b4) Tb4b4b4{
Tff7b72static Tff7b72constexpr Tffa657uint8_t Te6edf3TEST_PACKET_ONETb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0x11Tb4b4b4, T79c0ff0x12Tb4b4b4}Tb4b4b4;
Tff7b72static Tff7b72constexpr Tffa657uint8_t Te6edf3TEST_PACKET_TWOTb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0x21Tb4b4b4, T79c0ff0x22Tb4b4b4}Tb4b4b4;

Te6edf3serialTb4b4b4.Te6edf3setBlockWritesTb4b4b4(Tffa657trueTb4b4b4)Tb4b4b4;
Te6edf3modemTb4b4b4.Te6edf3onPacketReceivedTb4b4b4(Tb4b4b4(Tffa657int8_tTb4b4b4)Te6edf3TEST_SNRTb4b4b4, Tb4b4b4(Tffa657int8_tTb4b4b4)Te6edf3TEST_RSSITb4b4b4, Te6edf3TEST_PACKET_ONETb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3TEST_PACKET_ONETb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3modemTb4b4b4.Te6edf3onPacketReceivedTb4b4b4(Tb4b4b4(Tffa657int8_tTb4b4b4)Te6edf3TEST_SNRTb4b4b4, Tb4b4b4(Tffa657int8_tTb4b4b4)Te6edf3TEST_RSSITb4b4b4, Te6edf3TEST_PACKET_TWOTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3TEST_PACKET_TWOTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3serialTb4b4b4.Te6edf3setBlockWritesTb4b4b4(Tffa657falseTb4b4b4)Tb4b4b4;
Te6edf3modemTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72> Te6edf3expected Tff7b72= Tb4b4b4{
Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_DATATb4b4b4, Te6edf3TEST_PACKET_ONETb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3TEST_PACKET_ONETb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3KISS_FENDTb4b4b4,
Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_SETHARDWARETb4b4b4, Te6edf3HW_RESP_RX_METATb4b4b4, Te6edf3TEST_SNRTb4b4b4, Te6edf3TEST_RSSITb4b4b4, Te6edf3KISS_FENDTb4b4b4,
Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_SETHARDWARETb4b4b4, Te6edf3HW_RESP_ERRORTb4b4b4, Te6edf3HW_ERR_TX_BUSYTb4b4b4, Te6edf3KISS_FENDTb4b4b4}Tb4b4b4;
Te6edf3EXPECT_EQTb4b4b4(Te6edf3serialTb4b4b4.Te6edf3writesSnapshotTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3expectedTb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3TEST_FTb4b4b4(Te6edf3KissModemFixtureTb4b4b4, Te6edf3QueuedEncoderEscapesKissSpecialBytesTb4b4b4) Tb4b4b4{
Tff7b72static Tff7b72constexpr Tffa657uint8_t Te6edf3TEST_PACKETTb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_FESCTb4b4b4, T79c0ff0x01Tb4b4b4}Tb4b4b4;

Te6edf3modemTb4b4b4.Te6edf3onPacketReceivedTb4b4b4(Tb4b4b4(Tffa657int8_tTb4b4b4)Te6edf3TEST_SNRTb4b4b4, Tb4b4b4(Tffa657int8_tTb4b4b4)Te6edf3TEST_RSSITb4b4b4, Te6edf3TEST_PACKETTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3TEST_PACKETTb4b4b4)Tb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72> Te6edf3expected Tff7b72= Tb4b4b4{
Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_DATATb4b4b4, Te6edf3KISS_FESCTb4b4b4, Te6edf3KISS_TFENDTb4b4b4, Te6edf3KISS_FESCTb4b4b4, Te6edf3KISS_TFESCTb4b4b4, T79c0ff0x01Tb4b4b4, Te6edf3KISS_FENDTb4b4b4,
Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_SETHARDWARETb4b4b4, Te6edf3HW_RESP_RX_METATb4b4b4, Te6edf3TEST_SNRTb4b4b4, Te6edf3TEST_RSSITb4b4b4, Te6edf3KISS_FENDTb4b4b4}Tb4b4b4;
Te6edf3EXPECT_EQTb4b4b4(Te6edf3serialTb4b4b4.Te6edf3writesSnapshotTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3expectedTb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3TEST_FTb4b4b4(Te6edf3KissModemFixtureTb4b4b4, Te6edf3MaxPacketWorstCaseEscapingFitsQueuedFrameTb4b4b4) Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72> Te6edf3packetTb4b4b4(Te6edf3KISS_MAX_PACKET_SIZETb4b4b4, Te6edf3KISS_FENDTb4b4b4)Tb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72> Te6edf3expected Tff7b72= Tb4b4b4{Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_DATATb4b4b4}Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657size_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3packetTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3expectedTb4b4b4.Te6edf3push_backTb4b4b4(Te6edf3KISS_FESCTb4b4b4)Tb4b4b4;
Te6edf3expectedTb4b4b4.Te6edf3push_backTb4b4b4(Te6edf3KISS_TFENDTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3expectedTb4b4b4.Te6edf3push_backTb4b4b4(Te6edf3KISS_FENDTb4b4b4)Tb4b4b4;
Te6edf3expectedTb4b4b4.Te6edf3insertTb4b4b4(Te6edf3expectedTb4b4b4.Te6edf3endTb4b4b4(Tb4b4b4)Tb4b4b4, Tb4b4b4{Te6edf3KISS_FENDTb4b4b4, Te6edf3KISS_CMD_SETHARDWARETb4b4b4, Te6edf3HW_RESP_RX_METATb4b4b4, Te6edf3TEST_SNRTb4b4b4, Te6edf3TEST_RSSITb4b4b4, Te6edf3KISS_FENDTb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3modemTb4b4b4.Te6edf3onPacketReceivedTb4b4b4(Tb4b4b4(Tffa657int8_tTb4b4b4)Te6edf3TEST_SNRTb4b4b4, Tb4b4b4(Tffa657int8_tTb4b4b4)Te6edf3TEST_RSSITb4b4b4, Te6edf3packetTb4b4b4.Te6edf3dataTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3packetTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3EXPECT_EQTb4b4b4(Te6edf3serialTb4b4b4.Te6edf3writesSnapshotTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3expectedTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657int Te6edf3mainTb4b4b4(Tffa657int Te6edf3argcTb4b4b4, Tffa657charTff7b72*Tff7b72* Te6edf3argvTb4b4b4) Tb4b4b4{
Tff7b72:Tff7b72:Te6edf3testingTff7b72:Tff7b72:Te6edf3InitGoogleTestTb4b4b4(Tff7b72&Te6edf3argcTb4b4b4, Te6edf3argvTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3RUN_ALL_TESTSTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Served by rngit 1.5.2 - Generated in 0.08s